জাভা জেনেরিক্স মূলত Compile-Time টাইপ সেফটি নিশ্চিত করে। জেনেরিক্স ব্যবহার করলে কোড রানটাইমে টাইপ-রিলেটেড ত্রুটি থেকে মুক্ত থাকে এবং কোড আরও মডুলার এবং পুনঃব্যবহারযোগ্য হয়। এছাড়াও, জেনেরিক্সের মাধ্যমে কম্পাইল-টাইম অপ্টিমাইজেশনের কয়েকটি বিশেষ কৌশল ব্যবহার করা যায়, যা বড় প্রজেক্টে পারফরম্যান্স এবং মেইনটেন্যান্স উন্নত করে।
1. টাইপ সেফটি নিশ্চিতকরণ
কৌশল: Compile-Time এ টাইপ চেকিং নিশ্চিত করা।
জেনেরিক্স ব্যবহার করলে কম্পাইলার টাইপের ত্রুটি (যেমন ClassCastException) আগেই শনাক্ত করে।
public class GenericExample<T> {
private T value;
public void setValue(T value) {
this.value = value;
}
public T getValue() {
return value;
}
public static void main(String[] args) {
GenericExample<String> example = new GenericExample<>();
example.setValue("Hello");
System.out.println(example.getValue());
// Compile-time error: incompatible types
// example.setValue(10);
}
}
উপকারিতা:
- টাইপ সংক্রান্ত ত্রুটি Compile-Time এ শনাক্ত হয়।
- রানটাইম পারফরম্যান্স উন্নত হয় কারণ টাইপ চেকিং আগে থেকেই করা থাকে।
2. টাইপ ইরেজার (Type Erasure) এবং পারফরম্যান্স
কৌশল: জেনেরিক্স ব্যবহার করে Runtime Overhead কমানো।
জেনেরিক্সের মাধ্যমে টাইপ ইরেজার কম্পাইল-টাইমে সমস্ত জেনেরিক টাইপ মুছে দেয় এবং সেগুলোকে নির্দিষ্ট টাইপে কাস্ট করে।
উদাহরণ:
public class GenericErasureExample<T> {
public void printClass(T obj) {
System.out.println(obj.getClass().getName());
}
public static void main(String[] args) {
GenericErasureExample<String> example = new GenericErasureExample<>();
example.printClass("Generics"); // Output: java.lang.String
}
}
টাইপ ইরেজার প্রক্রিয়া:
- কম্পাইলার জেনেরিক টাইপ মুছে দেয়।
- প্রয়োজন হলে
Objectটাইপ ব্যবহার করে। - টাইপ-কাস্টিং কম্পাইল-টাইমেই নিশ্চিত করে।
3. জেনেরিকস এর মাধ্যমে রিডান্ডেন্সি দূরীকরণ
কৌশল: জেনেরিক মেথড ব্যবহার করে কোড পুনঃব্যবহারযোগ্য করা।
public class GenericUtility {
public static <T> void printArray(T[] array) {
for (T element : array) {
System.out.print(element + " ");
}
System.out.println();
}
public static void main(String[] args) {
Integer[] intArray = {1, 2, 3};
String[] strArray = {"Java", "Generics"};
printArray(intArray); // Output: 1 2 3
printArray(strArray); // Output: Java Generics
}
}
উপকারিতা:
- একাধিক ডেটা টাইপের জন্য একই মেথড ব্যবহার করা যায়।
- কোড পুনঃব্যবহারযোগ্য এবং সংক্ষিপ্ত হয়।
4. Wildcards এবং Flexibility
কৌশল: Wildcards ব্যবহার করে টাইপ ফ্লেক্সিবিলিটি বাড়ানো।
import java.util.List;
public class WildcardExample {
public static void printList(List<?> list) {
for (Object obj : list) {
System.out.println(obj);
}
}
public static void main(String[] args) {
List<Integer> intList = List.of(1, 2, 3);
List<String> strList = List.of("A", "B", "C");
printList(intList); // Prints: 1 2 3
printList(strList); // Prints: A B C
}
}
উপকারিতা:
- টাইপ নির্ধারণ না করেও একাধিক টাইপ পরিচালনা করা যায়।
- Compile-Time এ টাইপ কম্প্যাটিবিলিটি নিশ্চিত হয়।
5. Bounded Type Parameters ব্যবহার
কৌশল: Bounded টাইপ ব্যবহার করে নির্দিষ্ট টাইপ সীমাবদ্ধতা তৈরি করা।
public class BoundedTypeExample<T extends Number> {
private T value;
public BoundedTypeExample(T value) {
this.value = value;
}
public double getDoubleValue() {
return value.doubleValue();
}
public static void main(String[] args) {
BoundedTypeExample<Integer> intExample = new BoundedTypeExample<>(42);
System.out.println(intExample.getDoubleValue()); // Output: 42.0
BoundedTypeExample<Double> doubleExample = new BoundedTypeExample<>(3.14);
System.out.println(doubleExample.getDoubleValue()); // Output: 3.14
// Compile-time error: incompatible type
// BoundedTypeExample<String> strExample = new BoundedTypeExample<>("Test");
}
}
উপকারিতা:
- নির্দিষ্ট টাইপের জন্য সীমাবদ্ধতা তৈরি করা যায়।
- Compile-Time এ টাইপ চেকিং নিশ্চিত হয়।
6. জেনেরিক কনটেইনার ব্যবহার
কৌশল: জেনেরিক কন্টেইনার ব্যবহার করে মেমরি অপ্টিমাইজেশন।
import java.util.HashMap;
import java.util.Map;
public class GenericContainer<K, V> {
private Map<K, V> map = new HashMap<>();
public void add(K key, V value) {
map.put(key, value);
}
public V get(K key) {
return map.get(key);
}
public static void main(String[] args) {
GenericContainer<String, Integer> container = new GenericContainer<>();
container.add("Age", 25);
System.out.println(container.get("Age")); // Output: 25
}
}
উপকারিতা:
- টাইপ-সেফ ডেটা স্টোরেজ।
- Compile-Time এ ত্রুটি চিহ্নিত করা।
7. Type Token এবং Runtime Type Checking
কৌশল: Type Token ব্যবহার করে Runtime এ টাইপ যাচাই করা।
import java.lang.reflect.ParameterizedType;
public class GenericTypeToken<T> {
private Class<T> type;
@SuppressWarnings("unchecked")
public GenericTypeToken() {
this.type = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
}
public Class<T> getType() {
return type;
}
public static void main(String[] args) {
GenericTypeToken<String> typeToken = new GenericTypeToken<String>() {};
System.out.println(typeToken.getType().getName()); // Output: java.lang.String
}
}
- জেনেরিক্স ব্যবহার করে টাইপ সেফটি নিশ্চিত করা এবং Compile-Time এ ত্রুটি শনাক্ত করা যায়।
- Wildcards, Bounded Type Parameters, এবং Generic Methods কোড আরও ফ্লেক্সিবল এবং পুনঃব্যবহারযোগ্য করে তোলে।
- Type Erasure এর সুবিধা নিয়ে Compile-Time Optimization নিশ্চিত করা যায়।
- বড় প্রজেক্টে জেনেরিক্সের মাধ্যমে রিডান্ডেন্সি এবং টাইপ রিলেটেড ত্রুটি কমিয়ে কার্যকর কোড বেস তৈরি করা সম্ভব।
Content added By
Read more